(for Internet Explorer)
Sub  BinaryArray::ReDim_( UBound as integer )
バイナリ配列の要素数(=バイトサイズ)を変更します。 ReDim Preserve と同じです。
【引数】
UBound
新しい配列の最大要素番号
ReDim の末尾にアンダースコアが付いています。
(ReDim は予約語であるため。)
(src)
Sub  BinaryArray::Load( Path as string )
ファイルの内容を、バイナリ配列に入力します。
【引数】
Path
ファイルのパス
バイナリ配列に元々入っていた内容は無くなります。
関連
Sub  BinaryArray::Save( Path as string )
バイナリ配列の内容を、ファイルに出力します。
【引数】
Path
ファイルのパス
  Dim  i
  Dim  bin : Set bin = new BinaryArray
  bin.ReDim_  &hFF
  For i=0 To &hFF : bin(i) = i : Next
  bin.Save  "a.bin"
サンプル
Function  BinaryArray::Read( Offset as integer, Length as integer ) as array of Byte
バイナリ配列の内容の一部を、Byte 配列にして返します。
【引数】
Offset
配列の中で抽出する部分の先頭の位置。 配列の先頭から = 0
配列の中で抽出する部分の長さ(バイト)。 -1 = 最後まで
Length
Offset = 0 または Empty にすると、配列の先頭からになります。
Length = -1 または Empty にすると、配列の最後までになります。
返り値
配列の内容の一部を抽出した Byte 配列
返り値に、文字列関数 LeftB, MidB, RightB, LenB, AscB, ChrB を使うことができます。
返り値に対して + 演算子は使えませんが、MidB( ByteArray, 1 ) などで String 型に変換
すれば、+ 演算子が使えます。
サンプル
  binary = bin.Read( &h10, &h28 )
  echo  AscB( MidB( binary, 3, 1 ) )
サンプル
(src)
関連
Sub  BinaryArray::Write( Offset as integer, Length as integer, ByteArray as variant )
バイナリ配列の内容の一部を、変更します。
【引数】
ByteArray
変更内容が格納された文字列(UTF-16)、または配列、または数値
Length
配列の中で変更する部分の長さ(バイト)。 -1 = ByteArray 引数の全体
配列の中で変更する部分の先頭の位置。 配列の先頭から = 0
Offset
Offset = 0 または Empty にすると、配列の先頭からになります。
Length = -1 または Empty にすると、配列の最後までになります。
サンプル
  bin.Write  0, Empty, Array( &h42, &h4D )
サンプル
  bin.Write  0, 2, ChrB( &h42 ) + ChrB( &h4D )
  bin.Write  1, 1, &h4D
関連
(src)
Function  BinaryArray::ReadStruct( Offset as integer, out_Dic as dictionary,
                                   FormatArray as integer ) as integer
バイナリ配列の内容の一部をリードした内容を、構造化した辞書を取得します。
【引数】
Offset
配列の中で抽出する部分の先頭の位置。 配列の先頭から = 0
(出力) 数値の辞書。 キーは FormatArray に指定したもの。
out_Dic
返り値
抽出した部分のバイナリの大きさ(バイト)
サンプル
  Dim  bin, out, size
  bin.Write  &h10, Empty, Array( &h12, &h34, &h56, &h78, &h9A, &hBC, &hDE )
  size = bin.ReadStruct( &h10, out, Array( "a", vbByte,  "b", vbInteger+vbArray, 3 ) )
  '// out("a")    = &h12
  '// out("b")(0) = &h5634
  '// out("b")(1) = &h9A78
  '// out("b")(2) = &hDEBC
バイナリ配列から抽出する部分の型の集合 (下記)
FormatArray
(src)
FormatArray 引数
out_Dic (辞書型) に格納するキーの名前と、値の型を、順番に並べた配列を指定します。
vbInteger などの型に +vbArray したときは、配列をリードします。 このとき、更に配列の
要素数を指定してください。 要素数を -1 にすると、ファイルの最後までリードします。
下記の c は、ADODBConsts です。
vbByte
1バイト、符号なし、0〜255
vbInteger
2バイト、符号あり、-32768〜32767, &h0000〜&hFFFF
vbInteger + c.Unsigned
2バイト、符号なし、Long型、0〜65535
vbLong
4バイト、符号あり、-2147483648〜2147483647、&h10000〜&hFFFFFFFF
* + vbArray
配列。 vbByte などの型に vbArray をプラスしてください。
FormatArray には、配列の要素数も指定してください。
要素数を -1 にすると、ファイルの最後までリードします。
&h10  out
"a", vbByte,  "b", vbInteger+vbArray, 3
関連
Sub  BinaryArray::WriteStruct( Offset as integer, FormatAndDataArray as array )
構造化した配列を使って、バイナリ配列の内容の一部に、バイナリーデータをライトします。
【引数】
Offset
バイナリ配列の中で変更する範囲の先頭位置。 配列の先頭から = 0
バイナリ配列へライトする部分の型とライトする値の集合 (下記)
FormatAndDataArray
サンプル
    bin.WriteStruct  &h40, Array( vbByte, &h12, vbInteger, Array( &h5634, &h9A78, &hDEBC ) )
    '// bin = 0x0040 : 12 34 56 78 9A BC DE
関連
(src)
FormatAndDataArray 引数
「値の型」 要素と、「値、または、値を並べた配列」 要素を繰り返す配列を指定します。
vbByte
1バイト、符号なし、0〜255
vbInteger
2バイト、符号あり、-32768〜32767, &h0000〜&hFFFF
vbInteger + c.Unsigned
2バイト、符号なし、Long型、0〜65535
vbLong
4バイト、符号あり、-2147483648〜2147483647、&h10000〜&hFFFFFFFF
バイナリ配列 bin の 0x40 の位置に、vbByte型(8ビット整数型)の 0x12 と、vbInteger型(16ビット
整数型)の 0x5634, 0x9A78, 0xDEBC を格納します。
バイナリ配列 bin の 0 の位置に、vbByte型(8ビット整数型)の 0x12、0x34、0x56、0x78
を格納します。
    bin.WriteStruct  0, Array( vbByte, Array( &h12, &h34, &h56, &h78 ) )
    '// bin = 0x0000 : 12 34 56 78
Sub  BinaryArray::WriteFromBinaryArray( WriteOffset as integer,
  ReadBinaryArray as BinaryArray, ReadOffset as integer, Size as integer )
バイナリ配列の一部を別のバイナリ配列に、高速にコピーします。
【引数】
Me
コピー先となるバイナリ配列
Me の中で変更する範囲の先頭位置。 配列の先頭から = 0
WriteOffset
(src)
ReadBinaryArray
ReadOffset
Size
コピー元となるバイナリ配列
ReadBinaryArray の中の範囲の先頭位置。 配列の先頭から = 0
コピーするサイズ(バイト), -1=最後まで
ReadBinaryArray のサイズより大きな値を Size 引数に指定したときは、最後までコピーします。
Sub  BinaryArray::WriteFromDump( in_Offset  as integer,  in_Dump  as string )
文字列にダンプされたバイナリーデータを、バイナリ配列の内容の一部に、ライトします。
【引数】
in_Offset
バイナリ配列の中で変更する範囲の先頭位置。 配列の先頭から = 0
バイナリーデータをダンプした文字列
in_Dump
サンプル
→ System.vbs
ソース
    bin.WriteFromDump  %h10, "0x05 | 0x14, 0x1234, 0x98765432"
    '// bin = 0x0010 : 15 34 12 32 54 76 98
バイナリ配列 bin の 0 の位置に、vbByte型(8ビット整数型)の 0x12、0x34、0x56、0x78
を、格納します。
    bin.WriteFromDump  0, "12 34 56 78"
    '// bin = 0x0000 : 12 34 56 78
in_Dump 引数の中の、16進数と | 演算子以外は無視されます。 16進数は、接頭辞 0x を付けるか、
接頭辞を付けないでください。 | 演算子は、論理和です。
無視される文字を除き、16進数が連続すると次のデータであるとして処理します。
16進数の桁数がに応じて、整数のビット数が異なります。 2, 4, 8 桁なら、リトル エンディアンの
8, 16, 32 ビット整数になります。
テスト
T_Binary_FromDump
→ T_Binary.vbs
Function  BinaryArray::Compare( ThanBinary as BinaryArray )
バイナリ配列を比較します。
【引数】
ThanBinary
比較対象のバイナリ配列
テスト
→ T_Binary.vbs
→ System.vbs
ソース
返り値
一致=0、StrComp と同じ
関連
Sub  BinaryArray::SwapEndian( Offset as integer, Size as integer, SwapUnitSize as integer )
バイナリ配列の一部のエンディアンを逆にします。
【引数】
Offset
エンディアンを逆にする範囲の先頭オフセット
エンディアンを逆にする範囲のサイズ(バイト)
Size
サンプル
  '// bin = 12 34 56 78 9A BC DE
  bin.SwapEndian  &h2, &h4, 2
  '// bin = 12 56 34 9A 78 BC DE
バイナリ配列 bin の 0x2 の位置から始まる 4バイトの範囲を、2バイト単位(2バイト整数)で逆にします。
SwapUnitSize
逆にする単位
テスト
→ T_Binary.vbs
→ System.vbs
ソース
Sub  BinaryArray::ToEmpty()
配列を空にします。 配列要素数は 0 になります。
<BinaryArray size="6">
FF FE 6F 30 80 30
</BinaryArray>
出力例:
(src)
echo  ReadBinaryFile( "Sample.zip" ).MD5
バイナリー・データ(配列の全体)に対する ハッシュ値。
テスト
サンプル
ソース
→ System.vbs
→ T_Binary.vbs
→ MD5
関連
MD5 ハッシュ値は、0〜9, a〜f の文字が32文字の文字列になります。
SHA-1 ハッシュ値は、0〜9, a〜f の文字が40文字の文字列になります。
SHA-256 ハッシュ値は、0〜9, a〜f の文字が64文字の文字列になります。
Property Get  BinaryArray::SHA1() as string
キーワード:
Property Get  BinaryArray::SHA256() as string
SHA-256, SHA-384, SHA-512, RIPEMD-160 は、Windows Vista 以降で使えます。
Property Get  BinaryArray::SHA384() as string
Property Get  BinaryArray::SHA512() as string
SHA-384 ハッシュ値は、0〜9, a〜f の文字が96文字の文字列になります。
SHA-512 ハッシュ値は、0〜9, a〜f の文字が128文字の文字列になります。
RIPEMD-160 ハッシュ値は、0〜9, a〜f の文字が40文字の文字列になります。
Property Get  BinaryArray::RIPEMD160() as string
→ ハッシュ値
5c1d447971bc0c49f09b2e965ac4ed37
… 表示例
文字列からハッシュ値を得る場合
→ PowerShell - MD5を計算する
ファイルの内容が異なれば、ハッシュ値も異なります。 内容が異なるのにハッシュ値が
同じになる(衝突する)確率はわずかにありますが、実用的には問題ありません。
ファイルの内容のごく一部だけ変えたときは、衝突しません。 なぜなら、衝突させるには、
ハッシュ アルゴリズムによって決まる法則で、ファイルの内容の全体を合わせる必要が
あるからです。
なお、ファイルのハッシュ値は、
でも確認できます。
注意
バイナリ ファイルのハッシュ値を計算するときは、
をお使い
ください。 ReadBinaryFile は、データをすべてリードしてからハッシュ値を計算
するため、メモリー不足が発生する可能性があります。
Sub  Main()
    Set c = g_VBS_Lib

    path = InputPath( "zipファイルのパス >", c.CheckFileExists )
    echo  GetVersionString( path )
End Sub

Dim  g_VersionDataBase : g_VersionDataBase = Array(_
    "c28bae2972d4e9c9f90ed1861f0b8002", "vbslib, 4.00, 2012-07-02",_
    "700af264a9f00733b4d26f0407625d5b", "vbslib, 4.01, 2013-02-14" )

Function  GetVersionString( Path )
    If IsArray( g_VersionDataBase ) Then _
        Set g_VersionDataBase = Dict( g_VersionDataBase )

    value_of_MD5 = ReadBinaryFile( Path ).MD5
    If g_VersionDataBase.Exists( value_of_MD5 ) Then
        GetVersionString = g_VersionDataBase( value_of_MD5 )
    Else
        GetVersionString = "Unknown"
    End If
End Function
zip などのパッケージ・ファイルのバージョンを MD5 から判定するソース・コードのサンプル
を示します。
関連
  Set bin = new_BinaryArrayFromBase64( "EjRWeA==" )
  echo  bin.Base64
バイナリー・データ(配列の全体)に対する Base64 でエンコードされた文字列。
サンプル
ソース
→ System.vbs
テスト
→ T_Binary.vbs
Test_of_Base64
関連
→ Base64
参考
バイナリー・データを指定した文字コードセットの文字列とし、VBScript の文字列を返します。
ソース
→ System.vbs
テスト
→ T_Binary.vbs
T_Binary_TextCharacterSet
関連
文字コードセット一覧
Set shift_JIS_bin = new_BinaryArray( Array( &h8A, &hBF, &h8E, &h9A ) )
Assert  shift_JIS_bin.Text( "Shift-JIS" ) = "漢字"
サンプル
VBScript の文字列を指定した文字コードセットに変える
echo  GetHashOfFile( "A.bin", "MD5" )
Function  GetHashOfFile( in_Path as string,  in_HashType as string ) as string
ファイルのハッシュ値を計算します。 内部で ADODB か Power Shell を使います。
【引数】
in_Path
in_HashType
ハッシュ値を計算するファイルのパス
ハッシュ値の種類
返り値
ファイルのハッシュ値
サンプル
ソース
in_HashType 引数に指定できる値は、"MD5", "SHA1", "SHA256", "SHA384", "SHA512",
"RIPEMD160" です。
→ System.vbs
内部の ADODB でメモリー不足が発生したら、Power Shell を使用します。
関連
echo  GetHashPS( "A.bin", "MD5" )
Function  GetHashPS( in_Path as string,  in_HashType as string ) as string
ファイルのハッシュ値。 内部で Power Shell 使用。
【引数】
in_Path
in_HashType
ハッシュ値を計算するファイルのパス
ハッシュ値の種類
返り値
ファイルのハッシュ値
サンプル
ソース
in_HashType 引数に指定できる値は、"MD5", "SHA1", "SHA256", "SHA384", "SHA512",
"RIPEMD160" です。
→ System.vbs
→ RIFF 形式
WAV, AVI などの形式の一部にあたる、ツリー構造を持ったチャンクによって構成される
バイナリーデータ形式をリードします。
参考
Function  OpenForReadRIFF( in_Path as string ) as RIFF_Reader
RIFF 形式バイナリーファイルのリードを開始します。
【引数】
入力ファイルのパス
in_Path
返り値
内容をリードするときに使うオブジェクト
    Set bin = OpenForReadRIFF( "riff.bin" )

    Set chunk = bin.ReadFirstChild()  '// chunk as RIFF_ChunkClass
    Assert  chunk.FourCC = "Set "
    Assert  bin.Stack( 0 ).FourCC = "Root"
    Assert  bin.Stack( 1 ).FourCC = "Set "

    Set chunk = bin.ReadFirstChild()
    Assert  chunk.FourCC = "Elem"
    Assert  chunk.Size = 5
    Assert  not chunk.IsExistChild
    Assert  not chunk.IsExistNextSibling

    bin.ReadStruct  data, Array( _
        "a", vbByte+vbArray, 3, "b", vbInteger ) )
    Assert  data("a")(0) = &h41
    Assert  data("a")(1) = &h42
    Assert  data("a")(2) = &h43
    Assert  data("b") = &h4544  '// リトルエンディアン

    bin.ReturnToParent
    Set chunk = bin.ReadNextSibling()
    Assert  chunk.FourCC = "Elm2"
サンプル
RIFF( 'Root'
    LIST( 'Set '
        'Elem'( &h41, &h42, &h43, &h44, &h45 )
    )
    'Elm2'( &h58, &h59, &h5A )
)
上記のスクリプトは、下記のツリー構造をたどっています。
→ System.vbs
ソース
テスト
→ T_Binary.vbs
Function  RIFF_Reader::SeekChunkByIndexes( in_Empty as Empty,
    in_Indexes0_Array as array of integer ) as RIFF_ChunkClass
インデックス番号で指定したチャンクにジャンプして、リードします。
【引数】
in_Empty
Empty = ルート チャンクからたどる
テスト
→ T_Binary.vbs
T_RIFF_SeekChunkByIndexes
ソース
→ System.vbs
リードしたチャンクに関する情報
返り値
in_Indexes0_Array
インデックス番号の配列
RIFF チャンク
LIST チャンク
要素チャンク
要素チャンク
要素チャンク
要素チャンク
サンプル
Set chunk = a_RIFF.SeekChunkByIndexes( Empty, Array( 2, 0 ) )
Array( )
in_Indexes0_Array 引数の位置関係:
Array( 0 )
Array( 1 )
Array( 2 )
Array( 2, 0 )
Array( 2, 1 )
Function  RIFF_Reader::ReadFirstChild() as RIFF_ChunkClass
現在位置にあるリスト チャンクの、子チャンクのヘッダーをリードします。
【引数】
返り値
リードした子チャンクに関する情報
::IsExistChild = False のときに呼び出すとエラーになります。
Function  RIFF_Reader::ReadNextSibling() as RIFF_ChunkClass
現在位置の次の兄弟チャンクのヘッダーをリードします。
【引数】
返り値
リードした兄弟チャンクに関する情報
::IsExistNextSibling = False のときに呼び出すとエラーになります。